package org.ch02.test04;

import org.ch02.entity.Student;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Parameter;

/**
 * 反射常用 API - Method - 类的方法
 *
 * @author lwj
 * @date 2025-03-18
 * @vesion 1.0.0
 */
public class MainTest01 {
    public static void main(String[] args) {
        // 第一：获取操作类的 Class 对象
        Class<?> clazz = Student.class;

        // 第二：基于 Class  对象，实现相关的操作 - 运行时，动态性 - 框架，工具
        // 1.获取所有定义的方法 - 包括所有的访问修饰符 -  区别：getMethods
        Method[] methods = clazz.getDeclaredMethods();

        // 2.循环遍历所有的方法
        for (Method method : methods) {
            // 1.访问修饰符
            int modifiers = method.getModifiers();
            String modifierStr = Modifier.toString(modifiers);

            System.out.println("访问修饰符（整数表示）："+modifiers);
            System.out.println("访问修饰符（字符串表示）："+modifierStr);

            // 2.获取方法名称
            System.out.println("方法名称："+method.getName());

            // 3.获取方法参数
            Parameter[] parameters = method.getParameters();
            // 循环遍历方法参数列表
            for (Parameter parameter : parameters) {
                // 3.1）获取方法参数类型的 Class 对象
                Class<?> typeClass = parameter.getType();
                System.out.println("\t参数类型(包名.类名)："+typeClass.getName());
                System.out.println("\t参数类型(类名)："+typeClass.getSimpleName());

                // 3.2）获取方法参数的名称 - 参数名称默认以 argN 来命名
                String name = parameter.getName();
                System.out.println("\t参数名称："+name);
            }
            System.out.println("---------------------");
        }
    }
}
